package com.attendance.www.hr.utils;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;

public class ArithUtil {

	/**  
	 * 除法
	 * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指  
	 * 定精度，以后的数字四舍五入。  
	 * @param v1 被除数  
	 * @param v2 除数  
	 * @param scale 表示表示需要精确到小数点以后几位。  
	 * @return 两个参数的商  
	 */  
	public static BigDecimal div(BigDecimal v1,BigDecimal v2){
		if(v1 == null 
				|| v1.compareTo(BigDecimal.ZERO)==0
				|| v2 == null
				|| v2.compareTo(BigDecimal.ZERO)==0){
			return new BigDecimal(0);
		}
		return v1.divide(v2,10,BigDecimal.ROUND_HALF_UP); 
	}   
	
	/**
	 * 减法
	 * @param v1
	 * @param v2
	 * @param scale
	 * @return
	 */
	public static BigDecimal sub(BigDecimal v1,BigDecimal v2){
		if(v1 == null){
			v1 = new BigDecimal(0);
		}
		if(v2 == null){
			v2 = new BigDecimal(0);
		}
		//减法不会增加小数点后位数
		return v1.subtract(v2);
	}   
	
	/**
	 * 乘法
	 * @param v1
	 * @param v2
	 * @param scale
	 * @return
	 */
	public static BigDecimal mul(BigDecimal v1,BigDecimal v2){   
		if(v1 == null 
				|| v2 == null
				|| v1.compareTo(BigDecimal.ZERO)==0 
				|| v2.compareTo(BigDecimal.ZERO)==0){
			return new BigDecimal(0);
		}
		MathContext mc = new MathContext(10,RoundingMode.HALF_UP);  
		return v1.multiply(v2,mc); 
	}   
	
	/**
	 * 加法
	 * @param v1
	 * @param v2
	 * @param scale
	 * @return
	 */
	public static BigDecimal add(BigDecimal v1,BigDecimal v2){   
		if(v1 == null){
			v1 = new BigDecimal(0);
		}
		if(v2 == null){
			v2 = new BigDecimal(0);
		}
		if(v2.compareTo(BigDecimal.ZERO)==1) {
			return v1.add(v2);   
		}else if(v2.compareTo(BigDecimal.ZERO)==-1) {
			String str=v2.toString().replace("-", "");
			v1=ArithUtil.sub(v1, new BigDecimal(str));
			return v1;
		}else {
			return v1;
		}
	}   
	
	/**
	 * 格式化显示2位
	 * @param v1
	 * @return
	 */
	public static BigDecimal getScaleTwo(BigDecimal v1) {
		return v1.setScale(2,BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 格式化显示3位
	 * @param v1
	 * @return
	 */
	public static BigDecimal getScaleThree(BigDecimal v1) {
		return v1.setScale(3,BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 格式化显示4位
	 * @param v1
	 * @return
	 */
	public static BigDecimal getScaleFour(BigDecimal v1) {
		return v1.setScale(4,BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 合计
	 * @return
	 */
	public static BigDecimal addTotal(BigDecimal v1,BigDecimal v2) {
		if(v2.compareTo(BigDecimal.ZERO)==-1) {
			String str=v2.toString().replace("-", "");
			v1=ArithUtil.sub(v1, new BigDecimal(str));
		}
		else if(v2.compareTo(BigDecimal.ZERO)==1) {
			v1=ArithUtil.add(v1, v2);
		}
		return v1;
	}
	
	/**
	 * 百分比 0.00%
	 * @param db
	 * @return
	 */
	public static String percentage(BigDecimal v1,BigDecimal v2) {
		BigDecimal db=ArithUtil.div(v1, v2);
		if(db.compareTo(BigDecimal.ZERO)!=0) {
			DecimalFormat df = new DecimalFormat("0.00%");
			return df.format(db);
		}
		return "";
	}
	
	/**
	 * 格式化 百分比 0.00%
	 * @param db 
	 * @return
	 */
	public static String formatPercentage(BigDecimal db) {
		if(db.compareTo(BigDecimal.ZERO)!=0) {
			DecimalFormat df = new DecimalFormat("0.00%");
			return df.format(db);
		}
		return "";
	}
}
